package kioscodeal

import static org.springframework.http.HttpStatus.*
import grails.transaction.Transactional


@Transactional(readOnly = true)
class PedidoController {

    static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"]
	
	def beforeInterceptor = [action:this.&auth,
		except:["compra", "cargar","create","save","saveCarrito","edit", 
			"eliminarElementoCarrito", "vaciarCarrito", "indexPorUsuario","show"]]
	
	def scaffold = Pedido
	
	def pedidoService
	
	def auth() {
		if(!(session?.user?.role == Role.ADMINISTRATOR)){
			flash.message = "Usted debe ser Administrador para realizar esta tarea."
			redirect(uri:'/')
			return false
		}
	}

    def index(Integer max) {
        params.max = Math.min(max ?: 10, 100)
        respond Pedido.list(params), model:[pedidoInstanceCount: Pedido.count()]
    }
	
    def show(Pedido pedidoInstance) {
        respond pedidoInstance
    }

    def create() {
        respond new Pedido(params)
    }

    @Transactional
    def save(Pedido pedidoInstance) {
        if (pedidoInstance == null) {
            notFound()
            return
        }

        if (pedidoInstance.hasErrors()) {
            respond pedidoInstance.errors, view:'create'
            return
        }

        pedidoInstance.save flush:true

        request.withFormat {
            form multipartForm {
                flash.message = message(code: 'default.created.message', args: [message(code: 'pedido.label', default: 'Pedido'), pedidoInstance.id])
                redirect pedidoInstance
            }
            '*' { respond pedidoInstance, [status: CREATED] }
        }
    }

    def edit(Pedido pedidoInstance) {
        respond pedidoInstance
    }
	
	def mapear(Pedido pedidoInstance) {
		respond pedidoInstance
	}

    @Transactional
    def update(Pedido pedidoInstance) {
        if (pedidoInstance == null) {
            notFound()
            return
        }

        if (pedidoInstance.hasErrors()) {
            respond pedidoInstance.errors, view:'edit'
            return
        }

        pedidoInstance.save flush:true

        request.withFormat {
            form multipartForm {
                flash.message = message(code: 'default.updated.message', args: [message(code: 'Pedido.label', default: 'Pedido'), pedidoInstance.id])
                redirect pedidoInstance
            }
            '*'{ respond pedidoInstance, [status: OK] }
        }
    }

    @Transactional
    def delete(Pedido pedidoInstance) {

        if (pedidoInstance == null) {
            notFound()
            return
        }

        pedidoInstance.delete flush:true

        request.withFormat {
            form multipartForm {
                flash.message = message(code: 'default.deleted.message', args: [message(code: 'Pedido.label', default: 'Pedido'), pedidoInstance.id])
                redirect action:"index", method:"GET"
            }
            '*'{ render status: NO_CONTENT }
        }
    }

    protected void notFound() {
        request.withFormat {
            form multipartForm {
                flash.message = message(code: 'default.not.found.message', args: [message(code: 'pedido.label', default: 'Pedido'), params.id])
                redirect action: "index", method: "GET"
            }
            '*'{ render status: NOT_FOUND }
        }
    }
	
	/**************************************************  COMPRA  ********************************************************************/
	def compra(Integer max) {
		session.carrito = null
		session.noSuperaImporteMinimo = false
		params.max = Math.min(max ?: 10, 100)
		
		def listado = Producto.list(params)
		def productoPedidoInstanceList = new ArrayList<ProductoPedido>();
		
		for (def producto in Producto.list(params)){
			ProductoPedido productoPedido = new ProductoPedido()
			productoPedido.producto = producto
			productoPedido.cantidad = 0;
			productoPedidoInstanceList.add(productoPedido)
		}
		
		def listadoCarrito = new ArrayList<ProductoPedido>()
		def listadoCompra = new ArrayList<ProductoPedido>()

		respond productoPedidoInstanceList, model:[listadoCarrito: listadoCarrito, listadoCompra:listadoCompra, 
			importeTotalCompra:0.00, porcentajeDescuento:0.00]
	}
	
	def cargar(Long idProducto, Integer cantidadCarrito) {	
		def productoPedidoInstanceList = new ArrayList<ProductoPedido>()
		def listadoCarrito = new ArrayList<ProductoPedido>()
		def listadoCompra = new ArrayList<ProductoPedido>()		
		def datosImporteCompra = new DatosImporteCompra()
		
		pedidoService.cargarProducto(idProducto, cantidadCarrito, productoPedidoInstanceList, listadoCompra, datosImporteCompra, session)
		
		render(view: "compra", model:[productoPedidoInstanceList: productoPedidoInstanceList, listadoCarrito: listadoCarrito, listadoCompra: listadoCompra,
			importeTotalCompra: datosImporteCompra.importeTotal, porcentajeDescuento: datosImporteCompra.porcentajeDescuento])
	}
	
	@Transactional
	def saveCarrito() {		
		def datosImporteCompra = new DatosImporteCompra()
		def listadoPedido = pedidoService.saveCarrito(session, datosImporteCompra)
		if (listadoPedido != null){
			def pedidoInstance = pedidoService.procesarCarrito(listadoPedido, datosImporteCompra, session)
			
			if (pedidoInstance != null){
				def rdoGeolocalize = pedidoService.geolocalize(pedidoInstance)
				if (rdoGeolocalize){
					flash.message = message(code: 'default.created.message', args: [message(code: 'pedido.label', default: 'Pedido'), pedidoInstance.id])
					redirect(action: "show", id: pedidoInstance.id)
				} else {
					render(view: "create", model: [pedidoInstance: pedidoInstance])
					return
				}
			} else {
				cargar(-1, 0)
			}
		} else {
			cargar(-1, 0)
		}			
	}
	
	def eliminarElementoCarrito(Producto producto){
		pedidoService.buscarYeliminarElementoCarrito(producto.id, session)
		cargar(-1, 0)
	}
	
	def vaciarCarrito(){
		session.carrito = null
		cargar(-1, 0)
	}
	
	
	/**************************************************  Listado Pedido por Usuario  ********************************************************************/
	def indexPorUsuario() {		
		def listadoOk = new ArrayList<Pedido>()
		
		Pedido.findAll().each{
			if (it.cliente.id == session?.user.id){
				listadoOk.add(it)
			}
		}
		
		render(view: "index", model:[pedidoInstanceList: listadoOk, pedidoInstanceCount: listadoOk.size()])
	}
}

class DatosImporteCompra {
	Double importeTotal = 0
	Double porcentajeDescuento = 0
}
